package com.xinke.juc.sguigu.case02;

import com.xinke.juc.sguigu.util.Sleep;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
 * @Author：xinke
 * @Date：2025/10/9
 * @Desc: Future编码实战和优缺点分析
 * ● 优点：Future+线程池异步多线程任务配合，能显著提高程序的运行效率。
 * ● 缺点：
 * ○ get()阻塞---一旦调用get()方法求结果，一旦调用不见不散，非要等到结果才会离开，不管你是否计算完成，如果没有计算完成容易程序堵塞。
 * ○ isDone()轮询---轮询的方式会耗费无谓的cpu资源，而且也不见得能及时得到计算结果，如果想要异步获取结果，通常会以轮询的方式去获取结果，尽量不要阻塞。
 * ● 结论：Future对于结果的获取不是很友好，只能通过阻塞或轮询的方式得到任务的结果。
 */
@Slf4j
public class C02_FutureTaskApi {
    public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
        FutureTask<String> futureTask = new FutureTask<>(() -> {
            log.info(Thread.currentThread().getName()+" ---- come in");
            Sleep.seconds(5);
            return "task over...";
        });

        Thread t1 = new Thread(futureTask,"t1");
        t1.start();

//        log.info(futureTask.get()); //这样会有阻塞的可能，在程序没有计算完毕的情况下。
//        log.info(futureTask.get(3, TimeUnit.SECONDS)); //只愿意等待三秒，计算未完成直接抛出异常
        log.info(Thread.currentThread().getName()+" ---- 忙其他任务");
        while (true){
            if(futureTask.isDone()){
                log.info(futureTask.get());
                break;
            }else {
                Sleep.milliseconds(500);
                log.info("正在处理中，不要催了，越催越慢");
            }
        }
    }
}
